/*
 * @Description 
 * @Autor lzhiqiang
 * @Date 2023-02-25 16:32:36
 * @LastEditors lzhiqiang
 * @LastEditTime 2023-04-05 12:45:22
 */
#include "lock.h"
#include "macro.h"
#include "schedule.h"

#include <stdexcept>

namespace johnsonli
{
	SemaphoreLock::SemaphoreLock(uint32_t count)
	{
		if (sem_init(&m_semaphore, 0, count)) {
			throw std::logic_error("sem_init error");
		}
	}

	SemaphoreLock::~SemaphoreLock()
	{
		sem_destroy(&m_semaphore);
	}

	void SemaphoreLock::wait()
	{
		if (sem_wait(&m_semaphore)) {
			throw std::logic_error("sem_wait error");
		}
	}

	void SemaphoreLock::notify() {
		if (sem_post(&m_semaphore)) {
			throw std::logic_error("sem_post error");
		}
	}


	// FiberSemaphore::FiberSemaphore(size_t initial_concurrency)
	// 	:m_concurrency(initial_concurrency) {
	// }

	// FiberSemaphore::~FiberSemaphore() {
	// 	DO_ASSERT(m_waiters.empty());
	// }

	// bool FiberSemaphore::tryWait() {
	// 	DO_ASSERT(Scheduler::GetThis());
	// 	{
	// 		MutexType::Lock lock(m_mutex);
	// 		if(m_concurrency > 0u) {
	// 			--m_concurrency;
	// 			return true;
	// 		}
	// 		return false;
	// 	}
	// }

	// void FiberSemaphore::wait() {
	// 	DO_ASSERT(Scheduler::GetThis());
	// 	{
	// 		MutexType::Lock lock(m_mutex);
	// 		if(m_concurrency > 0u) {
	// 			--m_concurrency;
	// 			return;
	// 		}
	// 		m_waiters.push_back(std::make_pair(Scheduler::GetThis(), Fiber::GetThis()));
	// 	}
	// 	Fiber::YieldToHoldBySwap();
	// }

	// void FiberSemaphore::notify() {
	// 	MutexType::Lock lock(m_mutex);
	// 	if(!m_waiters.empty()) {
	// 		auto next = m_waiters.front();
	// 		m_waiters.pop_front();
	// 		next.first->schedule(next.second);
	// 	} else {
	// 		++m_concurrency;
	// 	}
	// }
	

}
